package tp.pr5.console;

import java.util.Scanner;

import tp.pr5.Controller;
import tp.pr5.Interpreter;
import tp.pr5.RobotEngine;
import tp.pr5.instructions.Instruction;

public class ConsoleController extends Controller{
	
	
	/**
	 * Constructor of the controller. It receives the model main class.

	Parameters:
	    game - Game that is being played.
	 * @param game
	 */	
	public ConsoleController(RobotEngine game){
		super(game);
	}
	/**
	 * Starts the engine with the main loop
	 */
	public void startController() {
		try{
		Scanner reader = new Scanner(System.in); //scanner a usar durante todo el bucle
		
		Instruction instructionGiven = null;//instruccion a usar durnte todo el bucle
		Interpreter interp = new Interpreter(); //interprete a usar durante todo el bucle
		
		//muestra localización inicial y dirección inicial desde robotengine	
		engine.emitArrivedAtPlace();		
		
		//el bucle funciona hasta que se llegue a la nave o se introduzca la acción QUIT
		while(!(engine.getNavigationModule().atSpaceship() || engine.getQuit() || engine.getFuel() <=0)){ //comprueba que no ha llegado a la nave y que la instruccion no es la de salir	
			//saca por pantalla 'WALL·E>'
			try{
				instructionGiven = getInstruction(reader, interp);//recoge de la consola la instrucción del usuario y la convierte en un objeto instruction
				engine.communicateRobot(instructionGiven);				
			}catch(Exception e){
				engine.emitError("WALL·E says: I do not understand. Please repeat");				
			}				
			
		}//fin del bucle principal
		}catch(Exception e){
			engine.emitError(e.getMessage());			
		}
		
	}
	/**
	 * Toma una instrucción de consola y usa el intérprete para convertirla en objeto
	 * @param sc
	 * @param interp
	 * @return
	 */
	private Instruction getInstruction(Scanner sc, Interpreter interp){		
		System.out.print(prompt());
		String ins = sc.nextLine();
		try{
			return Interpreter.parse(ins);
		}catch (Exception e){			
			return null;
		}
	}
	/**
	 * Imprime por pantalla 'WALL·E'
	 */
	private String prompt(){
		return "WALL·E> ";
	}

	
}
